import _ from 'lodash-es'
/**
 *  @typedef QuerySchema
 *  @property {string} label 标签名
 *  @property {string} field 字段名
 *  @property {string} component 组件名
 *  @property {'topper'|'drawer'} area 放置的区域，默认topper
 *  @property {object} componentProps 组件属性
 *  参数格式化,
 *  ArrayJoin 可使数组用逗号拼接，
 *  DateSplit 使日期时间范围分割成startTime,endTime
 *  SelectInput 使下拉输入框{type,name}转换成params[type]=name
 *  @property {function|'ArrayJoin'|'DateSplit'|'SelectInput'} fieldFormat
 *
 */
/**
 * @param {QuerySchema[]} schemas
 * @param {function} queryFormat
 */
export const useSchema = (schemas, queryFormat) => {
  // 搜索表单绑定的数据
  const queryItems = ref({})

  // 初始化数据
  function initQueryItems() {
    queryItems.value = Object.fromEntries(
      schemas.map(({ field, componentProps }) => {
        return [field, componentProps?.defaultValue ?? null]
      })
    )
  }

  // 经过格式化处理的最终查询参数
  function getQueryParams() {
    // 格式化处理时不要影响原表单数据
    const cloneData = _.cloneDeep(queryItems.value)
    const result = {}
    // 单个字段格式化处理
    for (const key in cloneData) {
      const value = cloneData[key]
      const { fieldFormat } = schemas.find((item) => item.field === key)
      if (typeof format === 'function') {
        // 自定义格式化
        result[key] = fieldFormat(value)
      } else if ('ArrayJoin' === fieldFormat) {
        // 数组用逗号拼接
        result[key] = value?.length ? value.join(',') : null
      } else if ('DateSplit' === fieldFormat) {
        // 日期时间范围分割
        if (value?.length === 2) {
          const [startTime, endTime] = value
          result['startTime'] = startTime
          result['endTime'] = endTime
        }
      } else if ('SelectInput' === fieldFormat) {
        if (value.type) {
          result[value.type] = value.name
        }
      } else {
        // 默认情况
        result[key] = value
      }
    }
    // 全部格式化处理
    if (typeof queryFormat === 'function') {
      return queryFormat(result)
    } else {
      return result
    }
  }

  watch(
    () => schemas,
    () => {
      initQueryItems()
    },
    {
      deep: true,
    }
  )
  return {
    queryItems,
    initQueryItems,
    getQueryParams,
  }
}
